#!/bin/bash

# 设置一个字符串变量，下面的都是对这个变量的操作
file=/dir1/dir2/dir3/my.file.txt

########################################################

# ${#var}：获得变量值的长度
echo ${#file}
# 输出：27

########################################################

# ${varx}：通过索引位置截取子字符串
echo ${file:0:5} # 截取最左侧的 5 个字符
# 输出：/dir1

echo ${file:5:5} # 从第 6 个字符开始，截取 5 个字符
# 输出：/dir2

########################################################

# ${var#}、${var##}：删除字符串左侧的值
echo ${file#*/} # 删除第一个 / 及其左侧的字符串
# 输出：dir1/dir2/dir3/my.file.txt

echo ${file##*/} # 删除最后一个 / 及其左侧的字符串
# 输出：my.file.txt

echo ${file#*.} # 删除第一个 . 及其左侧的字符串
# 输出：file.txt

echo ${file##*.} # 删除最后一个 . 及其左侧的字符串
# 输出：txt

########################################################

# ${var%}、${var%%}：删除字符串右侧的值

echo ${file%/*} # 删除最后一个 / 及其右侧的字符串
# 输出：/dir1/dir2/dir3

echo ${file%%/*} # 删除第一个 / 及其右侧的字符串
# 输出：(空值)

echo ${file%.*} # 删除最后一个 . 及其右侧的字符串
# 输出：/dir1/dir2/dir3/my.file

echo ${file%%.*} # 删除第一个 . 及其右侧的字符串
# 输出：/dir1/dir2/dir3/my

########################################################

# ${var:-word}：如果变量 var 为空、没有定义或已被删除（unset），那么返回 word，但不改变 var 的值。
echo ${var:-"var is not set"}
# 输出：var is not set

echo "var is ${var}"
# 此时 var 还是没有定义，所以输出：var is

########################################################
# ${var:=word}：如果变量 var 为空、没有定义或者已被删除，那么返回 word，并将 var 的值设置为 word。
echo ${var:="var is not set"}
# 输出：var is not set

echo "var is ${var}"
# 此时 var 已经定义为var is not set 了，所以输出：var is var is not set

# ${var:?message}：如果变量 var 为空、没有定义或者已被删除，那么将消息 message 送到标准错误输出。
# 可以用来检测变量 var 是否可以被正常赋值。若此替换出现在 shell 脚本中，那么脚本将停止运行。
# ${var:+word}：如果变量 var 被定义，那么返回 word，但不改变 var 的值。
